#pragma once

#include "MyAwaiter.h"

template <typename T>
struct promise_typeType
{
    T value = 0;

    promise_typeType()
    {
        std::cout << "promise_typeType" << std::endl;
    }

    ~promise_typeType()
    {
        std::cout << "~promise_typeType" << std::endl;
    }

    MyCoroutine get_return_object()
    {
        std::cout << "get_return_object" << std::endl;
        return MyCoroutine{CoroHandler::from_promise(*this)};
    }

    std::suspend_always initial_suspend()
    {
        std::cout << "initial_suspend" << std::endl;
        return {};
    }

    // 返回值强烈建议使用 std::suspend_always，不然容易出现崩溃，不挂起就直接析构了
    std::suspend_always final_suspend() noexcept
    {
        std::cout << "final_suspend" << std::endl;
        return {};
    }

    void unhandled_exception()
    {
        std::cout << "unhandled_exception" << std::endl;
    }

    // 自定义await_transform函数，用于处理整数类型的co_await
    MyAwaiter await_transform(int value) {
        return MyAwaiter{value};
    }

    // 当使用了 co_yield 的时候，需要实现该函数
    std::suspend_never yield_value(T v)
    {
        std::cout << "yield_value: " << v << std::endl;
        value = v;
        return {};
    }

    void return_value(T v)
    {
        std::cout << "return_value: " << v << std::endl;
        value = v;
    }

    // void return_void()
    // {
    //     std::cout << "return_void" << std::endl;
    // }
};